闭包

# 闭包

指在父级作用域外存在某个能够访问父级作用域的成员 将会造成父级的作用域不被销毁,成员能够操作父级作用域

function test(){
  var aa = 1;
  function b(){
    aa++;
    console.log(aa);
  }
  return b;
}

var fn = test();
fn()
test define -> [GO]
test doing -> [testAO,GO]

b define -> [testAO,GO]
b doing -> [bAO,testAO,GO]

当 b 被返回时是被保存起来,此时 test 函数执行完毕,那么 test 函数自身将会把 testAO 出栈,自己找不到了,但是此时还没有完,由于我们把b 保存到外部,b能够访问到 testAO 因为 b define 的时候是能够访问到 testAO 的。

闭包的使用会使作用域链不被释放造成内存泄露

# 闭包的应用

  • 实现共有变量 -- 累加器
  • 缓存
  • 实现私有变量
  • 模块化开发,防止全局变量的污染

# 立即执行函数

立即执行函数指的是执行完毕后会立即销毁 表现形式

(function (){}()) // w3c 标准建议 

 (function (){})()

只有表达式才能被执行符号”()”执行 也就是说只要我们将函数定义转换为表达式那么他就可以变成一个立即执行函数。

+ function test(){
            console.log('doing')
        }()

& function test(){
            console.log('doing')
        }();

(function (){
            console.log('doing')
        }());

! function test(){
            console.log('doing')
        }();

如果括号内有逗号 只会返回后面的内容

var f = (function (){
  console.log(1)
},
function (){
  console.log(2)
})()
// 最后只会返回 function(){console.log(2)}

放在运算符中的函数声明在执行阶段时找不到的

var x = 1
if(function f(){}){
  x += typeof f;
}
console.log(x)

<-->